package com.mybase.app.fourBase;

/**
 * Created by happy_000 on 2014/11/21.
 */
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import com.mybase.app.Utils.ToastUtil;

import java.util.Timer;
import java.util.TimerTask;

/***
 * context.startService() ->onCreate()- >onStart()->Service running--调用context.stopService() ->onDestroy()
 * context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()
 ****************
 * 本地服务 Local Service 用于应用程序内部。
 它可以启动并运行，直至有人停止了它或它自己停止。在这种方式下，它以调用Context.startService()启动，而以调用Context.stopService()结束。它可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。不论调用了多少次startService()方法，你只需要调用一次stopService()来停止服务。
 用于实现应用程序自己的一些耗时任务，比如查询升级信息，并不占用应用程序比如Activity所属线程，而是单开线程后台执行，这样用户体验比较好。
 * 远程服务 Remote Service 用于android系统内部的应用程序之间。
 它可以通过自己定义并暴露出来的接口进行程序操作。客户端建立一个到服务对象的连接，并通过那个连接来调用服务。连接以调用Context.bindService()方法建立，以调用 Context.unbindService()关闭。多个客户端可以绑定至同一个服务。如果服务此时还没有加载，bindService()会先加载它。
 可被其他应用程序复用，比如天气预报服务，其他应用程序不需要再写这样的服务，调用已有的即可。

 生命周期
 Service的生命周期并不像Activity那么复杂，它只继承了onCreate(),onStart(),onDestroy()三个方法，当我们第一次启动Service时，先后调用了onCreate(),onStart()这两个方法，当停止Service时，则执行onDestroy()方法，这里需要注意的是，如果Service已经启动了，当我们再次启动Service时，不会在执行onCreate()方法，而是直接执行onStart()方法。

 而启动service，根据onStartCommand的返回值不同，有两个附加的模式：
 1. START_STICKY 用于显示启动和停止service。
 2. START_NOT_STICKY或START_REDELIVER_INTENT用于有命令需要处理时才运行的模式。

 服务不能自己运行，需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service，但是它们的使用场合有所不同。
 1. 使用startService()方法启用服务，调用者与服务之间没有关连，即使调用者退出了，服务仍然运行。
 如果打算采用Context.startService()方法启动服务，在服务未被创建时，系统会先调用服务的onCreate()方法，接着调用onStart()方法。
 如果调用startService()方法前服务已经被创建，多次调用startService()方法并不会导致多次创建服务，但会导致多次调用onStart()方法。
 采用startService()方法启动的服务，只能调用Context.stopService()方法结束服务，服务结束时会调用onDestroy()方法。

 2. 使用bindService()方法启用服务，调用者与服务绑定在了一起，调用者一旦退出，服务也就终止，大有“不求同时生，必须同时死”的特点。
 onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用，当调用者与服务已经绑定，多次调用Context.bindService()方法并不会导致该方法被多次调用。
 采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除，服务结束时会调用onDestroy()方法。
 官方文档告诉我们，一个service可以同时start并且bind，在这样的情况，系统会一直保持service的运行状态如果service已经start了或者BIND_AUTO_CREATE标志被设置。如果没有一个条件满足，那么系统将会调用onDestory方法来终止service.所有的清理工作（终止线程，反注册接收器）都在onDestory中完成。

 */
public class LocalService extends Service {

    private static final String TAG = "LocalService";
    private IBinder binder=new LocalService.LocalBinder();
    private Timer timer;
    boolean isUploading = false;

    @Override
    public boolean onUnbind(Intent intent) {
        ToastUtil.toastLonger(this," Unbind");
        return super.onUnbind(intent);
    }

    @Override
    public IBinder onBind(Intent intent) {
        ToastUtil.toastLonger(this," onBind");
        return binder;
    }
    @Override
    public void onCreate() {
        Log.i(TAG, "onCreate");
        ToastUtil.toastShortly(this,"onCreate");
        super.onCreate();
    }
    public void MyMethod(){
        Log.i(TAG, "BindService-->MyMethod()");
    }
    @Override
    public void onStart(Intent intent, int startId) {
        Log.i(TAG, "onStart");
        ToastUtil.toastShortly(this,"onStart");
        super.onStart(intent, startId);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        this.timer = new Timer();
        this.timer.schedule(new AutoUploadService(), 0, 30 * 1000);
        Log.i(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }




    /**
     * ******
     * 定时器
     */
    class AutoUploadService extends TimerTask {

        @Override
        public void run() {
            Log.i(TAG, "定时器运行");
            if (isUploading) {
                Log.i(TAG, "正在处理上传，请稍后……");
                return;
            }
        }
    }




    @Override
    public void onDestroy() {
        Log.i(TAG, "onDestroy");
        super.onDestroy();
    }


    //定义内容类继承Binder
    public class LocalBinder extends Binder{
        //返回本地服务
        public LocalService getService(){
            return LocalService.this;
        }
    }


}